package main

import (
	"database/sql" //这包一定要引用，是底层的sql驱动
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	//"strconv" //这个是为了把int转换为string
	//"reflect"
	//"github.com/gin-gonic/gin/json"\
 	"encoding/json"
)

type userinfos struct{
	Id int
	Lvs string
}
func main() { //main函数
	db, err := sql.Open("mysql", "gcore:gcore@tcp(192.168.200.248:3306)/test?charset=utf8")
	//数据库连接字符串，别告诉我看不懂。端口一定要写/
	if err != nil { //连接成功 err一定是nil否则就是报错
		panic(err.Error())       //抛出异常
		fmt.Println(err.Error()) //仅仅是显示异常
	}
	defer db.Close() //只有在前面用了 panic 这时defer才能起作用，如果链接数据的时候出问题，他会往err写数据

	rows, err := db.Query("select id,lvs from userinfo")
	//判断err是否有错误的数据，有err数据就显示panic的数据
	if err != nil {
		panic(err.Error())
		fmt.Println(err.Error())
		return
	}
	defer rows.Close()
	// reflect
	//printResult(rows)
	//ref_res := reflect.ValueOf(rows)
	//fmt.Println(ref_res)

	//var result [] string
	//var tmp [2] string
	result := make([]userinfos, 0)
	for rows.Next(){
		var userInfo userinfos
		rows.Scan(&userInfo.Id, &userInfo.Lvs)
		//fmt.Println(userInfo.Id)
		//tmp[0] = strconv.Atoi(userInfo.Id)
		//tmp[1] = userInfo.Lvs
		result = append(result, userInfo)
	}

	var jsonRes,_ = json.Marshal(result)
	fmt.Println(result)
	fmt.Println(string(jsonRes))
	//var jsonArr,_ = json.Unmarshal(jsonRes)
	//fmt.Println(jsonArr)
	//insert_sql := "INSERT INTO userinfo(lvs) VALUES(?)"
	//_, e4 := db.Exec(insert_sql, "nima")
	//fmt.Println(e4)
	db.Close() // 关闭数据库
}


func printResult(query *sql.Rows) {
	column, _ := query.Columns()              //读出查询出的列字段名
	values := make([][]byte, len(column))     //values是每个列的值，这里获取到byte里
	scans := make([]interface{}, len(column)) //因为每次查询出来的列是不定长的，用len(column)定住当次查询的长度
	for i := range values {                   //让每一行数据都填充到[][]byte里面
		scans[i] = &values[i]
	}
	results := make(map[int]map[string]string) //最后得到的map
	i := 0
	for query.Next() { //循环，让游标往下移动
		if err := query.Scan(scans...); err != nil { //query.Scan查询出来的不定长值放到scans[i] = &values[i],也就是每行都放在values里
			fmt.Println(err)
			return
		}
		row := make(map[string]string) //每行数据
		for k, v := range values {     //每行数据是放在values里面，现在把它挪到row里
			key := column[k]
			row[key] = string(v)
		}
		results[i] = row //装入结果集中
		i++
	}
	for k, v := range results { //查询出来的数组
		//jsonStr,_ := json.Marshal(v)
		fmt.Println(k, v)
	}
}